package com.cjq.define;

import com.cjq.constant.ContentType;
import io.minio.ObjectStat;
import io.minio.messages.Part;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.List;

public interface MinioServiceInterface {



    String getPublicURL(String url);

    // ================== Bucket 操作 ==================
    /**
     * 检查存储桶是否存在
     * @param bucketName 存储桶名称
     * @return 是否存在
     */
    boolean bucketExists(String bucketName);

    /**
     * 创建存储桶
     * @param bucketName 存储桶名称
     */
    void makeBucket(String bucketName);

    // ================== 文件上传操作 ==================

    String uploadFile(String bucketName, String originalFilename, InputStream stream, ContentType contentType);

    /**
     * 上传文件（通过 MultipartFile）
     * @param bucketName 存储桶名称
     * @param file Spring MultipartFile 对象
     * @return 生成的文件名（包含路径）
     */
    String uploadFile(String bucketName, MultipartFile file);


    // ================== 文件下载操作 ==================
    /**
     * 获取文件输入流
     * @param bucketName 存储桶名称
     * @param objectName 存储对象路径
     * @return 文件输入流
     */
    InputStream getObject(String bucketName, String objectName);

    /**
     * 下载文件到本地
     * @param bucketName 存储桶名称
     * @param objectName 存储对象路径
     * @param localFilePath 本地保存路径
     */
    void downloadFile(String bucketName, String objectName, String localFilePath);

    /**
     * 删除单个文件
     * @param bucketName 存储桶名称
     * @param objectName 存储对象路径
     */
    void removeObject(String bucketName, String objectName);

    /**
     * 批量删除文件
     * @param bucketName 存储桶名称
     * @param objectNames 文件路径列表
     */
    void removeObjects(String bucketName, List<String> objectNames);

    // ================== 高级操作 ==================
    /**
     * 获取文件元数据
     * @param bucketName 存储桶名称
     * @param objectName 存储对象路径
     * @return 文件信息（包含元数据）
     */
    ObjectStat getObjectInfo(String bucketName, String objectName);

    /**
     * 分片上传初始化
     * @param bucketName 存储桶名称
     * @param objectName 存储对象路径
     * @return 上传ID
     */
    String initMultiPartUpload(String bucketName, String objectName);

    /**
     * 合并分片上传
     * @param bucketName 存储桶名称
     * @param objectName 存储对象路径
     * @param uploadId 上传ID
     * @param partETags 分片标识列表
     */
    void completeMultiPartUpload(String bucketName, String objectName,
                                 String uploadId, List<Part> partETags);
}
